//package com.crawler.downloader;
//
//import com.crawler.api.CrawlerDownloader;
//import com.crawler.model.CrawlerPageInfo;
//import com.crawler.model.CrawlerRequestInfo;
//import com.gargoylesoftware.htmlunit.HttpMethod;
//import com.gargoylesoftware.htmlunit.ProxyConfig;
//import com.gargoylesoftware.htmlunit.WebClient;
//import com.gargoylesoftware.htmlunit.WebRequest;
//import com.gargoylesoftware.htmlunit.html.HtmlPage;
//import com.gargoylesoftware.htmlunit.util.Cookie;
//import com.gargoylesoftware.htmlunit.util.NameValuePair;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Service;
//
//import java.io.IOException;
//import java.net.InetSocketAddress;
//import java.net.Proxy;
//import java.net.URL;
//import java.util.Map;
//
//@Service("htmlUnitDownloader")
//@Slf4j
//public class HtmlUnitDownloader implements CrawlerDownloader {
//    @Override
//    public CrawlerPageInfo download(CrawlerRequestInfo crawlerRequestInfo) {
//
//        WebClient webClient = new WebClient();
//        try {
//            WebRequest webRequest = new WebRequest(new URL(crawlerRequestInfo.getUrl()));
//            // 请求设置
//            webClient.getOptions().setUseInsecureSSL(true);
//            webClient.getOptions().setJavaScriptEnabled(true);
//            webClient.getOptions().setCssEnabled(false);
//            webClient.getOptions().setThrowExceptionOnScriptError(false);
//            webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
//            webClient.getOptions().setDoNotTrackEnabled(false);
//            webClient.getOptions().setUseInsecureSSL(!crawlerRequestInfo.isValidateTLSCertificates());
//
//            if (crawlerRequestInfo.getParamMap() != null && !crawlerRequestInfo.getParamMap().isEmpty()) {
//                for (Map.Entry<String, String> paramItem : crawlerRequestInfo.getParamMap().entrySet()) {
//                    webRequest.getRequestParameters().add(new NameValuePair(paramItem.getKey(), paramItem.getValue()));
//                }
//            }
//            if (crawlerRequestInfo.getCookieMap() != null && !crawlerRequestInfo.getCookieMap().isEmpty()) {
//                webClient.getCookieManager().setCookiesEnabled(true);
//                for (Map.Entry<String, String> cookieItem : crawlerRequestInfo.getCookieMap().entrySet()) {
//                    webClient.getCookieManager().addCookie(new Cookie("", cookieItem.getKey(), cookieItem.getValue()));
//                }
//            }
//            if (crawlerRequestInfo.getHeaderMap() != null && !crawlerRequestInfo.getHeaderMap().isEmpty()) {
//                webRequest.setAdditionalHeaders(crawlerRequestInfo.getHeaderMap());
//            }
//            if (crawlerRequestInfo.getUserAgent() != null) {
//                webRequest.setAdditionalHeader("User-Agent", crawlerRequestInfo.getUserAgent());
//            }
//            if (crawlerRequestInfo.getReferrer() != null) {
//                webRequest.setAdditionalHeader("Referer", crawlerRequestInfo.getReferrer());
//            }
//
//            webClient.getOptions().setTimeout(crawlerRequestInfo.getTimeoutMillis());
//            webClient.setJavaScriptTimeout(crawlerRequestInfo.getTimeoutMillis());
//            webClient.waitForBackgroundJavaScript(crawlerRequestInfo.getTimeoutMillis());
//
//            // 代理
//            if (crawlerRequestInfo.getProxy() != null) {
//                InetSocketAddress address = (InetSocketAddress) crawlerRequestInfo.getProxy().address();
//                boolean isSocks = crawlerRequestInfo.getProxy().type() == Proxy.Type.SOCKS;
//                webClient.getOptions().setProxyConfig(new ProxyConfig(address.getHostName(), address.getPort(), isSocks));
//            }
//
//            // 发出请求
//            if (crawlerRequestInfo.isIfPost()) {
//                webRequest.setHttpMethod(HttpMethod.POST);
//            } else {
//                webRequest.setHttpMethod(HttpMethod.GET);
//            }
//            HtmlPage page = webClient.getPage(webRequest);
//
//            String pageAsXml = page.asXml();
//            if (pageAsXml != null) {
//               CrawlerPageInfo crawlerPageInfo=new CrawlerPageInfo();
//               crawlerPageInfo.setBody(pageAsXml);
//               return crawlerPageInfo;
//            }
//        } catch (IOException e) {
//            log.error(e.getMessage(), e);
//        } finally {
//            if (webClient != null) {
//                webClient.close();
//            }
//        }
//        return null;
//
//    }
//}
